\documentclass{classrep}
\usepackage[utf8]{inputenc}
\usepackage{color}
\usepackage{graphicx}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{amssymb, amsmath}

\lstset{
  language=Java,
  numbers=left,
  frame=single,
  basicstyle=\footnotesize,
  captionpos=b,
  showspaces=false,
  showstringspaces=false,
}

\studycycle{Informatyka, studia dzienne, II st.}
\coursesemester{II}

\coursename{Komputerowe systemy rozpoznawania}
\courseyear{2012/2013}

\courseteacher{dr hab. inż. Adam Niewiadomski profesor PŁ}
\coursegroup{poniedziałek, 12:15}

\author{
  \studentinfo{Łukasz Kucharczyk}{170404} \and
  \studentinfo{Adam Taciak}{170405}
}

\title{Zadanie 2: Lingwistyczne podsumowania baz danych na zbiorach rozmytych typu 1 oraz interwałowych zbiorach rozmytych typu 1 -- uzupełnienie}
%\svnurl{http://code.google.com/p/kuznia-kodu/source/browse/trunk/ksr2/}

\begin{document}
\maketitle

Niniejsze uzupełnienie aplikacji uwzględnia implementację interwałowych zbiorów rozmytych typu 1 oraz zmiany w graficznym interfejsie użytkownika.

\section{Materiały i metody}
W odniesieniu do poprzedniej wersji aplikacji, w bierzącej wersji zaimplementowana została klasa \textbf{IntervalFuzzySet1} która realizuje
obsługę interwałowych zbiorów rozmytych typu 1. Klasa implementuje interfejs \textbf{IFuzzySet}, ten sam który implementuje klasa realizująca
obsługę zbiorów rozmytych typu 1. Dzięki zachowaniu zgodności z tym interfejsem, aplikację można było jedynie rozszerzyć, nie było konieczne
duże zmiany programistyczne w pozostałych klasach.

Klasa \textbf{IntervalFuzzySet1} przechowuje w sobie dwa obiekty klasy \textbf{FuzzySetType1}, które z koleji posiadają w sobie dolną
oraz górną funckję przynależności. Przykładowy fragment kodu źródłowego wraz z opisem, został zmieszczony poniżej:

\begin{lstlisting}
Dense universe = new Dense(0, 100);

Triangular lowerMembership = new Triangular(
  ObjectContructor.createPoints3(20, 0, 25, 1, 30, 0));
FuzzySetType1 lowerSet = new FuzzySetType1();
lowerSet.setMembershipFunction(lowerMembership);

Triangular upperMembership = new Triangular(
  ObjectContructor.createPoints3(22, 0, 25, 1, 28, 0)); 
FuzzySetType1 upperSet = new FuzzySetType1();
upperSet.setMembershipFunction(upperMembership);

IFuzzySet intervalSet = new IntervalFuzzySet1();
intervalSet.setLowerFuzzySet(lowerSet);
intervalSet.setUpperFuzzySet(upperSet);
intervalSet.setUniverseOfDiscorse(universe);
\end{lstlisting}

W linii 1 tworzony jest obiekt gęstej przestrzeni rozważań. Linie 3 -- 5 odpowiedzialne są za tworzenie obiektu zbioru rozmytego typu 1 oraz 
funkcji przynależności. Funkcja ta będzie wykorzystywana jako dolna funkcja przynależności dla interwałowego zbioru rozmytego typu 1. Istotną
informacją jest to, iż na tym etapie nie ma potrzeby wstawiania do tego obiektu, obiektu przestrzeni rozważań. Wstawienie obiektu przestrzeni
rozważań do obiektu zbioru interwałowego typu 1 spowoduje nadpisanie obiektów przestrzeni rozważań w zbiorach typu 1.
Linie 8 -- 11 odpowiedzialne są za tworzenie obiektu zbioru rozmytego typu 1 w którym przechowywana będzie dolna funkcja przynależności.
Ostatecznie w liniach 13 -- 16 tworzony jest interwałowy zbiór rozmyty typu 1 do którego wstawiane są dwa poprzednio utworzone zbiory oraz
przestrzeń rozważań.

Jak już wcześniej wspomniano, nie ma potrzeby ,,ręcznego'' wstawiania obiektu przestrzeni rozważań do zbiorów budujących obiekt zbioru interwałowego
typu 1, gdyż obiekt ten jest automatycznie wstawiany do zbiorów budujących zbiór interwałowy, co prezentuje fragment implementacji klasy
\textbf{IntervalFuzzySet1}.
\begin{lstlisting}
public void setUniverseOfDiscorse(IUniverseOfDiscourse universe) {
  this.universe = universe;
  if (lowerSet != null) {
    lowerSet.setUniverseOfDiscorse(universe);
  }
  if (upperSet != null) {
    upperSet.setUniverseOfDiscorse(universe); 
  }
}
\end{lstlisting}

Tworzenie sumaryzatora (czy kwalifikatora) odbywa się w identyczny sposób jak dla zbiorów rozmytych typu 1. W metodzie \textbf{setFuzzySet} obiektów
tworzących sumaryzatory parametrem wejściowym jest obiekt implementujący interfejs \textbf{IFuzzySet}. Przykładowy fragment kodu tworzącego
sumaryzator w oparciu o interwałowy zbiór rozmyty, został zamieszczony poniżej.
\begin{lstlisting}
Summarizer s1 = new Summarizer();
s1.setFuzzySet(intervalSet);
s1.setName("okolo 25 minut");
s1.setColumn("min");
\end{lstlisting}

Rozbudowie uległa również klasa \textbf{Summary} która realizuje podsumowania lingwistyczne. Konieczna była implementacja zestawu metod obliczających 
mierniki jakości podsumowań dla sumaryzatorów oraz kwalifikatorów zbudowanych w oparciu o interwałowe zbiory rozmyte typu 1 oraz łączenia 
zbiorów typu 1 z interwałowymi zbiorami typu 1.

Wywołanie metody \textbf{qualityMeasures} na obiekcie (np. sumaryzatorze) zbudowanego w oparciu o interwałowy zbiór rozmyty uruchamia alternatywną
wersję metod do obliczeń miar jakości podsumowania dla zbiorów interwałowych.

\begin{lstlisting}
public void qualityMeasures() {
  if (!isInterval) {
    double T1  = T1();
    ..
    double T11 = T11();
    double T = T();
	
  Results results = new Results(T1, T2, T3, T4, T5, T6, T7,
                T8, T9, T10, T11, T, generateSummaryText());
  this.results = results;
} else {
  Interval T1_interval  = T1_interval();
  ..
  Interval T11_interval = T11_interval();
  Interval T_interval   = T_interval();

  Results results = new Results(T1_interval, T2_interval,
                    T3_interval, T4_interval, T5_interval,
                    T6_interval, T7_interval, T8_interval,
                    T9_interval, T10_interval, T11_interval,
                    T_interval, generateSummaryText());
  this.results = results;
}
}
\end{lstlisting}

Również klasa \textbf{Results} została dostosowana do wyświetlania wyników miar jakości podsumowań dla obiektów
(sumaryzatorów, kwalifikatorów) zbuodwanych w oparciu o interwałowe zbiory rozmyte typu 1.

\section{Graficzny interfejs użytkownika}
Główne okno programu zostało przedstawione na rysunku \ref{fig1}. Składa się ono z paska menu (w którym istnieje możliwość przejścia do opcji zaawansowanych), z pola roboczego (zawierającego listę sumaryzatorów) oraz przycisku generującego podsumowanie.
\begin{figure}[ht]
    \centering
      \includegraphics[width=0.7\textwidth]{img/main.png}
    \caption{Okno główne.}
    \label{fig1}
\end{figure}

\subsection{Generowanie podsumowania}
W oknie głównym znajduje się panel z listą sumaryzatorów. Każda lista przypisana jest do konkretnej kolumny i oddzielona separatorem. Z panelu wybieramy opcje dla których będą generowane podsumowania, a następnie naciskamy na przycisk \textit{Generuj}.
Po wykonaniu obliczeń pojawia się nowe okno (rysunek \ref{fig2}) z tabelą zawierającą treść podsumowania wraz z jej miarami. W oknie mamy możliwość wyboru podsumowań oraz zapisu ich do pliku.

\begin{figure}[ht]
    \centering
      \includegraphics[width=0.9\textwidth]{img/summary.png}
    \caption{Okno wygenerowanego podsumowania.}
    \label{fig2}
\end{figure}


\subsection{Opcje zaawansowane}
Opcje zaawansowane umożliwiają definiowanie, modyfikowanie oraz usuwanie kwantyfikatorów i wartości zmiennych lingwistycznych.

\subsubsection{Kwantyfikatory}
\begin{figure}[ht]
    \centering
      \includegraphics[width=0.5\textwidth]{img/kwantyfikator.png}
    \caption{Okno definiowania kwantyfikatorów.}
    \label{fig3}
\end{figure}

Okno kwantyfikatory (rysunek \ref{fig3}) składa się z:
\begin{itemize}
  \item listy rozwijanej zawierającej nazwy kwantyfikatorów,
  \item przycisku dodającego nową nazwę kwantyfikatora,
  \item przycisku usuwającego aktualnie zaznaczonego kwantyfikatora,
  \item przycisku definującego przestrzeń rozważań
  \item przycisku definującego funkcje przynależności
  \item przycisku zapisującego nowy kwantyfikator bądź aktualizujący modyfikacje kwantyfikatora
\end{itemize}

Tworzenie nowego kwantyfikatora odbywa się w następujący sposób:
\begin{enumerate}
  \item utworzenie nowej nazwy kwantyfikatora - przycisk \textit{Nowy},
  \item wybranie z rozwijanej listy nowego kwantyfikatora,
  \item określenie typu oraz zdefiniowanie przestrzeni rozważań,
  \item określenie typu oraz zdefiniowanie funkcji przynależności,
  \item zatwierdzenie wartości - przycisk \textit{Zapisz}.
\end{enumerate}

Usuwanie kwantyfikatora odbywa się poprzez wybranie kwantyfikatora, a następnie naciśnięcia przycisku usuń.

Modyfikacja kwantyfikatora odbywa się w analogiczny sposób co tworzenie nowego kwantyfikatora za wyjątkiem definiowania jego nazwy.

\subsubsection{Wartości zmiennych lingwistycznych}
Okno \textit{wartości zL} (rysunek \ref{fig4}) jest rozszerzeniem okna \textit{kwantyfikatory}. Poza polami znajdującymi się w oknie kwantyfikatorów zawiera: rozwijalną listę nazw atrybutów tabeli, opcje wybór typu funkcji przynależności. Proces dodawania/edytowania/usuwania jest analogiczny do tych samych procesów co w kwantyfikatorach.

\begin{figure}[ht]
    \centering
      \includegraphics[width=0.5\textwidth]{img/cechy.png}
    \caption{Okno definiowania wartości zmiennych lingwistycznych.}
    \label{fig4}
\end{figure}

\subsection{Pliki konfiguracyjne}
Jedną z cech aplikacji jest możliwość ,,zapamiętywania'' wcześniej zdefiniowanych parametrów. Parametry (kwantyfikatory, wartości zmiennych lingwistycznych) zapisywane są do odpowiednich plików konfiguracyjnych w formacie xml. 

\begin{lstlisting}
<schema>
  <Features type="INTERVAL" typeUniverse="gesta" 
   typeMembership="trojkatna" typeMembership2="trojkatna">
    <Name>grano krotko</Name>
    <UniverseOfDiscourse>0;60</UniverseOfDiscourse>
    <PointsOfMebershipFunction>1.0;1.0 8.0;1.0 10.0;0.0</PointsOfMebershipFunction>
    <PointsOfMebershipFunction2>2.0;1.0 7.0;1.0 8.0;0.0</PointsOfMebershipFunction2>
    <Column>min</Column>
  </Features>
  <Features typeUniverse="gesta" typeMembership="trojkatna">
    <Name>nie grano wcale</Name>
    <UniverseOfDiscourse>0;60</UniverseOfDiscourse>
    <PointsOfMebershipFunction>0.0;1.0 1.0;0.0 60.0;0.0</PointsOfMebershipFunction>
    <Column>min</Column>
  </Features>
</schema>
\end{lstlisting}

Powyższy listing prezentuje jeden z plików konfiguracyjnych. Jest on przykładem przechowywania wartości zmiennych lingwistycznych w pliku xml. Obiekty w pozostałych przypadkach przechowywane są w podobny sposób.

\section{Wyniki}
\begin{verbatim}
W około 6000 meczach jest/ma grano krótko [0.315, 0.481]
W około 6000 meczach jest/ma grał przypadkowy asystent [0.983, 0.991]
W ponad 100 meczach jest/ma grano krótko [0.686, 0.710]
W ponad 100 meczach jest/ma przeciętna skuteczność [0.935, 0.949]
W ponad 100 meczach jest/ma grał spokojnie [0.523, 0.589]
W ponad 100 meczach jest/ma zdobto mało punktów [0.311, 0.351]
W mniej niż 1/4 meczach jest/ma grano przez cały mecz [0.592, 0.621]
W mniej niż 1/4 meczach jest/ma zdobyto dużo punktów [0.947, 0.978]
W mniej niż 1/4 meczach jest/ma grał agresywnie [0.599, 0.614]
\end{verbatim}


\end{document}
